Любительская метеостанция. Датчик температуры DS18B20.

Любительская метеостанция. Датчик температуры DS18B20.

Характеристики датчика температуры DS18B20 и подключение его к контроллеру ESP8266.

В качестве датчика измерения температуры в любительской станции используется DS18B20. Рассмотрим, что из себя представляет этот датчик, каким образом его можно подключить к контроллеру, а также приведем пример программы, получающей значение температуры с датчика и выводящего его в последовательный порт.

Описание

Цифровой термометр DS18B20 обеспечивает 9-12-ти битное измерение температуры в градусах Цельсия и имеет функцию сигнализации с энергонезависимой программируемой пользователем верхней и нижней точками срабатывания.

DS18B20

DS18B20 обменивается данными по шине 1-Wire, которой требуется только одна линия данных (и заземление) для связи с контроллером. Кроме того, DS18B20 может получать питание непосредственно от линии передачи данных («паразитное питание»), что устраняет необходимость во внешнем источнике питания. Каждый DS18B20 имеет уникальный 64-битный серийный код, который позволяет нескольким DS18B20 работать на одной и той же шине 1-Wire. Таким образом, можно легко использовать один контроллер для управления несколькими DS18B20. 

DS18B20 осуществляет измерение температуры и преобразует полученный результат в цифровой код. Установив количество бит точности от 9 до 12, можно получить разрешающую способность 0,5 °С, 0,25 °С, 0,125 °С и 0,0625 °С.

Характеристики датчика

  • Диапазон измерения: -55...+125 °C.
  • Точность: ±0.5°C в диапазоне -10...  +85°C.
  • Разрешающая способность измерения 9... 12 бит.
  • Напряжение питания: 3...5.5 В.
  • Распиновка : желтый провод (DATA), красный провод (VCC), черный провод (GND).
  • Водонепроницаемый корпус из нержавеющей стали.
  • Длина кабеля: 1000 мм.

Структурная схема

DS18B20 схема структурная

Подключение датчика к контроллеру

Между линией данных (желтый провод) и питанием (красный провод) необходимо подключить подтягивающий резистор 4,7 кОм. Для удобства подключения к тестовой плате контроллера также подпаиваются коннекторы.

Подключение DS18B20

После чего красный провод подключается к пину 3,3V, черный к GND, желтый к IO0 (или GPIO0, или D3, что одно и то же):

Подключение DS18B20

Программа получения температуры

Для обмена данными с датчиком используются библиотеки DallasTemperature и OneWire. Достаточно произвести установку первой, вторая подтянется в Arduino IDE как зависимость. Библиотеку подключаем через "Скетч - Подключить библиотеку - Управлять библиотеками". В открывшемся окошке ищем и устанавливаем библиотеку DallasTemperature, соглашаясь на установку необходимых зависимостей.

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 0 // Пин подключения OneWire шины, gpio0 (D3)

OneWire oneWire(ONE_WIRE_BUS); // Подключаем бибилиотеку OneWire
DallasTemperature sensors(&oneWire); // Подключаем бибилиотеку DallasTemperature

DeviceAddress temperatureSensors[1]; // Размер массива определяем исходя из количества установленных датчиков
uint8_t deviceCount = 0;

// Функция вывода адреса датчика 
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX); // Выводим адрес датчика в HEX формате 
  }
}


void setup() {
  Serial.begin(115200); // Задаем скорость соединения с последовательным портом 

  sensors.begin(); // Иницилизируем датчики
  
  deviceCount = sensors.getDeviceCount(); // Получаем количество обнаруженных датчиков
  for (uint8_t index = 0; index < deviceCount; index++)
  {
    sensors.getAddress(temperatureSensors[index], index);
  }
}

void loop() {
  Serial.println();
  
  sensors.requestTemperatures();
  
  for (int i = 0; i < deviceCount; i++)
  {
    printAddress(temperatureSensors[i]); // Выводим название датчика
    Serial.print(": ");
    Serial.println(sensors.getTempC(temperatureSensors[i])); // Выводим температуру с датчика
  }
  delay(5000);

}

Поскольку на один порт можно подключить несколько датчиков температуры, необходимо задать, какое их количество будет использоваться в данный момент. Это происходит в строке:

DeviceAddress temperatureSensors[1]; // Размер массива определяем исходя из количества установленных датчиков

Где 1 - количество датчиков в схеме.

Прошиваем контроллер и открываем монитор порта.

Пример вывода в порт: